/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKReporteLogistica;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenPedido;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioDetalleOrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.DetalleGuiaRemision;
import pe.com.cotelasa.scp.entidad.DetalleOrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.OrdenPedido;
import pe.com.cotelasa.scp.entidad.Proveedor;

/**
 *
 * @author WINDOWS 7
 */
@Named(value = "MBReporteLogistica")
@Scope("request")
public class MBReporteLogistica extends MBGenerico implements Serializable {

    private static Logger logger = Logger.getLogger(MBReporteProduccion.class);
    @Inject
    private BKReporteLogistica bkReporte;
    @Inject
    private IServicioOrdenPedido servicioOP;
    @Inject
    private IServicioOrdenCompraServicio servicioOCS;
    @Inject
    private IServicioDetalleOrdenCompraServicio servicioDetalleOCS;
    @Autowired
    BKSession session;

    public String mostrarMantenimiento() {

        bkReporte.setOrdenPedidoBusqueda(new OrdenPedido());
        bkReporte.setOrdenCompraBusqueda(new OrdenCompraServicio());
        bkReporte.getOrdenPedidoBusqueda().setIdEmpresa(session.getEmpresa());
        bkReporte.getOrdenPedidoBusqueda().setTipoOp('T');
        try {
            bkReporte.setListaOrdenesPedido(servicioOP.listarOrdenesPedidoActivosPorTipo(bkReporte.getOrdenPedidoBusqueda()));
            System.out.println("tipo: " + bkReporte.getOrdenPedidoBusqueda().getTipoOp());
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
        }

        bkReporte.setOrdenarArt("");
        bkReporte.setDetalleOrdenCompra(new DetalleOrdenCompraServicio());
        bkReporte.getDetalleOrdenCompra().setIdOrdenCompraServicio(new OrdenCompraServicio());
        bkReporte.getDetalleOrdenCompra().setIdArticulo(new Articulo());
        bkReporte.getDetalleOrdenCompra().getIdArticulo().setNombreComercial("");
        bkReporte.getDetalleOrdenCompra().getIdOrdenCompraServicio().setIdProveedor(new Proveedor());
        bkReporte.getDetalleOrdenCompra().getIdOrdenCompraServicio().getIdProveedor().setRazonSocial("");
        bkReporte.getDetalleOrdenCompra().getIdOrdenCompraServicio().setIdEmpresa(session.getEmpresa());

        return URLPaginacion.OrdenCompraServicio.URL_REPORTES_LOGISTICA;

    }

    public void buscarOPPorTipo() {
        try {

            bkReporte.setListaOrdenesPedido(servicioOP.listarOrdenesPedidoActivosPorTipo(bkReporte.getOrdenPedidoBusqueda()));
        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }

    public void reporteOrdenCompraAbierto() throws IOException, ServiceException {
        OrdenCompraServicio orden = bkReporte.getOrdenCompraBusqueda();

        orden.setIdEmpresa(session.getEmpresa());

        orden.setTipo('C');
        String[] listaEsdado = new String[]{};
        if (orden.getEstadoOrden().equalsIgnoreCase("")) {

            listaEsdado = new String[]{"" + OrdenCompraServicio.ESTADO_ORDEN_SC.ABIERTO.getValor(),
                "" + OrdenCompraServicio.ESTADO_ORDEN_SC.CERRADO.getValor()};

        } else {
            listaEsdado = new String[]{orden.getEstadoOrden()};

        }
        if (orden.getIdOrdenPedido() == null) {
            orden.setIdOrdenPedido(new OrdenPedido());
            orden.getIdOrdenPedido().setTipoOp(bkReporte.getOrdenPedidoBusqueda().getTipoOp());
        }
        DetalleOrdenCompraServicio detalleOC = new DetalleOrdenCompraServicio();
        detalleOC.setIdOrdenCompraServicio(orden);
        List<DetalleOrdenCompraServicio> listaOrdenes = servicioDetalleOCS.buscarDetalleOrdenCSReporte(detalleOC, listaEsdado, bkReporte.getFechaInicioOC(), bkReporte.getFechaFinalOC());

        //Workbook workbook = new XSSFWorkbook(OPCPackage.open(new FileInputStream("d:/ChartSample.xlsx"))); // or sample.xls
        HSSFWorkbook wb = new HSSFWorkbook();
        //HSSFSheet sheet = wb.createSheet("Cotizaciones");
        HSSFSheet sheet = wb.createSheet("Ordenes Compra");

        sheet.setAutobreaks(true);
        //sheet.setDefaultColumnWidth(10);
        sheet.setAlternativeFormula(true);
        sheet.setColumnWidth(0, 1000);
        sheet.setColumnWidth(1, 4500);
        sheet.setColumnWidth(2, 4500);
        sheet.setColumnWidth(3, 4500);
        sheet.setColumnWidth(4, 12000);
        sheet.setColumnWidth(5, 1000);
        sheet.setColumnWidth(6, 4500);
        sheet.setColumnWidth(7, 4500);
        //sheet.setVerticallyCenter(true);
        sheet.setRowSumsBelow(true);

        HSSFCellStyle borderStyle = wb.createCellStyle();
        borderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle borderDotStyle = wb.createCellStyle();
        borderDotStyle.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderRight(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderTop(HSSFCellStyle.BORDER_DOTTED);

        HSSFPalette palette = wb.getCustomPalette();
        palette.setColorAtIndex(HSSFColor.VIOLET.index, (byte) 75, (byte) 172, (byte) 198);

        /**
         * ***** fuente para titulo ******************
         */
        HSSFFont cabFont = wb.createFont();
        cabFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cabFont.setFontHeightInPoints(Short.valueOf("10"));

        HSSFCellStyle cabStyle = wb.createCellStyle();
        cabStyle.setFont(cabFont);
        cabStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        /**
         * ***** fuente para cabecera ******************
         */
        HSSFFont cliFont = wb.createFont();
        cliFont.setColor(HSSFColor.WHITE.index);
        cliFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cliFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle cliStyle = wb.createCellStyle();
        cliStyle.cloneStyleFrom(borderStyle);
        cliStyle.setFillForegroundColor(HSSFColor.VIOLET.index);
        cliStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        cliStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        cliStyle.setFont(cliFont);

        /**
         * ***** fuente para detalle ******************
         */
        HSSFFont contFont = wb.createFont();
        contFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle contStyle = wb.createCellStyle();
        contStyle.cloneStyleFrom(borderDotStyle);
        contStyle.setFont(contFont);
        contStyle.setWrapText(true);

        /**
         * ***** fuente para detalle Numerico ******************
         */
        HSSFCellStyle contNStyle = wb.createCellStyle();
        contNStyle.cloneStyleFrom(borderDotStyle);
        contNStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
        contNStyle.setFont(contFont);

        /**
         * ***** fuente para generado por ******************
         *
         * HSSFFont genFont = wb.createFont();
         * genFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
         * genFont.setFontHeightInPoints(Short.valueOf("9"));
         *
         *
         * HSSFCellStyle genStyle = wb.createCellStyle();
         * genStyle.setFont(genFont); genStyle.setWrapText(true);
         *
         */
        HSSFRow rowCab = sheet.createRow(1);

        HSSFCell cellCab0 = rowCab.createCell(0);
        cellCab0.setCellStyle(cabStyle);
        String tipo = orden.getIdOrdenPedido().getTipoOp() == 'T' ? "TELA " : "PRENDA ";
        cellCab0.setCellValue("ORDENES DE COMPRA DE " + tipo + armarFecha(bkReporte.getFechaInicioOC(), bkReporte.getFechaFinalOC()));
        CellRangeAddress region = new CellRangeAddress(1, 1, 0, 7);
        sheet.addMergedRegion(region);


        HSSFRow rowC = sheet.createRow(4);

        HSSFCell cellCli = rowC.createCell(0);
        cellCli.setCellStyle(cliStyle);
        cellCli.setCellValue("Nº");

        cellCli = rowC.createCell(1);
        cellCli.setCellStyle(cliStyle);
        cellCli.setCellValue("NUMERO OP");

        cellCli = rowC.createCell(2);
        cellCli.setCellStyle(cliStyle);
        cellCli.setCellValue("NUMERO OC");

        cellCli = rowC.createCell(3);
        cellCli.setCellStyle(cliStyle);
        cellCli.setCellValue("ESTADO");

        cellCli = rowC.createCell(4);
        cellCli.setCellStyle(cliStyle);
        cellCli.setCellValue("ARTICULO");

        cellCli = rowC.createCell(5);
        cellCli.setCellStyle(cliStyle);
        cellCli.setCellValue("UM");

        cellCli = rowC.createCell(6);
        cellCli.setCellStyle(cliStyle);
        cellCli.setCellValue("REQUERIDO");

        cellCli = rowC.createCell(7);
        cellCli.setCellStyle(cliStyle);
        cellCli.setCellValue("DESPACHADO");
        int rowCot = 5;
        int j = 1;
        for (DetalleOrdenCompraServicio detalleOrdenC : listaOrdenes) {
            BigDecimal cantidadRecibida = BigDecimal.ZERO;
            BigDecimal cantidadSolicitada = BigDecimal.ZERO;
            String unidadMedida = "";
            /*List<DetalleOrdenCompraServicio> listaDetalles = servicioDetalleOCS.listarDetallesPorOrden(ordenC);
             int i = listaDetalles.size() - 1;*/
            HSSFRow row = sheet.createRow(rowCot);

            HSSFCell cell = row.createCell(0);
            cell.setCellStyle(contStyle);
            cell.setCellValue(j);

            cell = row.createCell(1);
            cell.setCellStyle(contStyle);
            cell.setCellValue(detalleOrdenC.getIdOrdenCompraServicio().getIdOrdenPedido().getCodigoOrdenPedido());

            cell = row.createCell(2);
            cell.setCellStyle(contStyle);
            cell.setCellValue(detalleOrdenC.getIdOrdenCompraServicio().getCodigo());

            cell = row.createCell(3);
            cell.setCellStyle(contStyle);
            cell.setCellValue(detalleOrdenC.getIdOrdenCompraServicio().getEstadoOrden().equalsIgnoreCase("" + OrdenCompraServicio.ESTADO_ORDEN_SC.ABIERTO.getValor())
                    ? OrdenCompraServicio.ESTADO_ORDEN_SC.ABIERTO.name() : OrdenCompraServicio.ESTADO_ORDEN_SC.CERRADO.name());


            cantidadRecibida = cantidadRecibida.add(calcularRecibido(detalleOrdenC, detalleOrdenC.getIdOrdenCompraServicio()));
            cantidadSolicitada = cantidadSolicitada.add(detalleOrdenC.getCantidad());
            unidadMedida = detalleOrdenC.getIdTipoUnidadMinima().getAbrev();

            cell = row.createCell(4);
            cell.setCellStyle(contStyle);
            cell.setCellValue(detalleOrdenC.getIdArticulo().getNombreComercial());

            cell = row.createCell(5);
            cell.setCellStyle(contStyle);
            cell.setCellValue(unidadMedida);

            cell = row.createCell(6);
            cell.setCellStyle(contNStyle);
            cell.setCellValue(cantidadSolicitada.floatValue());

            cell = row.createCell(7);
            cell.setCellStyle(contNStyle);
            cell.setCellValue(cantidadRecibida.floatValue());

            j++;
            rowCot++;
        }
        rowCot++;

        /*HSSFRow rowT = sheet.createRow(rowCot);

         HSSFCell cellT0 = rowT.createCell(0);
         cellT0.setCellStyle(cantStyle);
         cellT0.setCellValue("Total de Ordenes de Compra:");

         HSSFCell cellT1 = rowT.createCell(1);
         cellT1.setCellStyle(cantStyle);
         cellT1.setCellValue(listaOrdenes.size());

         HSSFRow rowGU = sheet.createRow(rowCot + 2);

         HSSFCell cellGU0 = rowGU.createCell(0);
         cellGU0.setCellStyle(genStyle);
         cellGU0.setCellValue("Generado por:");

         HSSFCell cellGU1 = rowGU.createCell(1);
         cellGU1.setCellStyle(genStyle);
         cellGU1.setCellValue(session.getUsuario().getNombres() + " " + session.getUsuario().getApellidos());

         HSSFRow rowGF = sheet.createRow(rowCot + 3);

         HSSFCell cellGF0 = rowGF.createCell(0);
         cellGF0.setCellStyle(genStyle);
         cellGF0.setCellValue("Fecha:");

         HSSFCell cellGF1 = rowGF.createCell(1);
         cellGF1.setCellStyle(genStyle);
         cellGF1.setCellValue(UtilitarioFecha.formatearFecha(new Date(), "dd/MM/yyyy"));*/

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.setResponseContentType("application/vnd.ms-excel");
        externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"ResumenOrdenesCompra.xls\"");

        wb.write(externalContext.getResponseOutputStream());
        facesContext.responseComplete();

    }

    public String armarFecha(Date inicio, Date fin) {
        String fecha = "";
        if (inicio == null && fin == null) {
            fecha = "Al " + UtilitarioFecha.formatearFecha(new Date(), "dd MMMM yyyy").toUpperCase();
        } else if (inicio != null && fin != null) {
            fecha = "Del " + UtilitarioFecha.formatearFecha(inicio, "dd MMMM yyyy").toUpperCase() + " al "
                    + UtilitarioFecha.formatearFecha(fin, "dd MMMM yyyy").toUpperCase();
        } else if (inicio == null) {
            fecha = "Al " + UtilitarioFecha.formatearFecha(fin, "dd MMMM yyyy").toUpperCase();
        } else if (fin == null) {
            fecha = "Del " + UtilitarioFecha.formatearFecha(inicio, "dd MMMM yyyy").toUpperCase() + " al "
                    + UtilitarioFecha.formatearFecha(new Date(), "dd MMMM yyyy").toUpperCase();
        }


        return fecha;
    }

    public void marcarInicioOC(DateSelectEvent event) {
        bkReporte.setFechaInicioOC(event.getDate());
    }

    public void marcarFinalOC(DateSelectEvent event) {
        bkReporte.setFechaFinalOC(event.getDate());
    }

    public BigDecimal calcularRecibido(DetalleOrdenCompraServicio detalle, OrdenCompraServicio orden) {
        BigDecimal cantidad = BigDecimal.ZERO;

        if (orden.getGuiaRemisionCollection().size() > 0) {
            for (GuiaRemision guia : orden.getGuiaRemisionCollection()) {
                //if (guia.getIdFactura() != null) {
                for (DetalleGuiaRemision detalleGR : guia.getDetalleGuiaRemisions()) {
                    if (detalleGR.getEstadoRegistro().equals("" + ESTADO_REGISTRO.ACTIVO.getValor())
                            && guia.getEstadoGuia().equals("" + GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())
                            && detalleGR.getDetalleOrdenCompraServicio().equals(detalle)) {
                        cantidad = cantidad.add(detalleGR.getCantidad());
                    }
                }
                //}
            }
        }

        return cantidad;
    }

    /**
     * ********************** REPORTE DE ARTICULOS DE OC **********************
     */
    public void reporteArticulosOC() throws IOException, ServiceException {

        List<DetalleOrdenCompraServicio> listaDetalles = servicioDetalleOCS.listarDetallesParaReporteOC(bkReporte.getDetalleOrdenCompra(), bkReporte.getOrdenarArt(), bkReporte.getFechaInicioArt(), bkReporte.getFechaFinalArt());

        //Workbook workbook = new XSSFWorkbook(OPCPackage.open(new FileInputStream("d:/ChartSample.xlsx"))); // or sample.xls
        HSSFWorkbook wb = new HSSFWorkbook();
        //HSSFSheet sheet = wb.createSheet("Cotizaciones");
        HSSFSheet sheet = wb.createSheet("Proveedores Articulo");

        sheet.setAutobreaks(true);
        //sheet.setDefaultColumnWidth(10);
        sheet.setAlternativeFormula(true);
        sheet.setColumnWidth(0, 1000);
        sheet.setColumnWidth(1, 4500);
        sheet.setColumnWidth(2, 4500);
        sheet.setColumnWidth(3, 12000);
        sheet.setColumnWidth(4, 12000);
        sheet.setColumnWidth(5, 4500);
        //sheet.setVerticallyCenter(true);
        sheet.setRowSumsBelow(true);

        HSSFCellStyle borderStyle = wb.createCellStyle();
        borderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle borderDotStyle = wb.createCellStyle();
        borderDotStyle.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderRight(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderTop(HSSFCellStyle.BORDER_DOTTED);

        HSSFPalette palette = wb.getCustomPalette();
        palette.setColorAtIndex(HSSFColor.VIOLET.index, (byte) 247, (byte) 150, (byte) 70);

        /**
         * ***** fuente para titulo ******************
         */
        HSSFFont titFont = wb.createFont();
        titFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        titFont.setFontHeightInPoints(Short.valueOf("10"));

        HSSFCellStyle titStyle = wb.createCellStyle();
        titStyle.setFont(titFont);
        titStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        /**
         * ***** fuente para cabecera ******************
         */
        HSSFFont cabFont = wb.createFont();
        cabFont.setColor(HSSFColor.WHITE.index);
        cabFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cabFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle cabStyle = wb.createCellStyle();
        cabStyle.cloneStyleFrom(borderStyle);
        cabStyle.setFillForegroundColor(HSSFColor.VIOLET.index);
        cabStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        cabStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        cabStyle.setFont(cabFont);

        /**
         * ***** fuente para detalle ******************
         */
        HSSFFont contFont = wb.createFont();
        contFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle contStyle = wb.createCellStyle();
        contStyle.cloneStyleFrom(borderDotStyle);
        contStyle.setFont(contFont);
        contStyle.setWrapText(true);

        /**
         * ***** fuente para detalle Numerico ******************
         */
        HSSFCellStyle contNStyle = wb.createCellStyle();
        contNStyle.cloneStyleFrom(borderDotStyle);
        contNStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
        contNStyle.setFont(contFont);

        HSSFRow rowCab = sheet.createRow(1);

        HSSFCell cellCab0 = rowCab.createCell(0);
        cellCab0.setCellStyle(titStyle);
        cellCab0.setCellValue("PRECIO DE ARTICULOS POR PROVEEDOR " + armarFecha(bkReporte.getFechaInicioOC(), bkReporte.getFechaFinalOC()));
        CellRangeAddress region = new CellRangeAddress(1, 1, 0, 4);
        sheet.addMergedRegion(region);


        HSSFRow rowC = sheet.createRow(4);

        HSSFCell cellCli = rowC.createCell(0);
        cellCli.setCellStyle(cabStyle);
        cellCli.setCellValue("Nº");

        cellCli = rowC.createCell(1);
        cellCli.setCellStyle(cabStyle);
        cellCli.setCellValue("FECHA");
        
        cellCli = rowC.createCell(2);
        cellCli.setCellStyle(cabStyle);
        cellCli.setCellValue("OP");
        
        cellCli = rowC.createCell(3);
        cellCli.setCellStyle(cabStyle);
        cellCli.setCellValue("ARTICULO");
        
        cellCli = rowC.createCell(4);
        cellCli.setCellStyle(cabStyle);
        cellCli.setCellValue("PROVEEDOR");

        cellCli = rowC.createCell(5);
        cellCli.setCellStyle(cabStyle);
        cellCli.setCellValue("PRECIO");

        int rowCot = 5;
        int j = 1;
        for (DetalleOrdenCompraServicio detalle : listaDetalles) {
            int i = listaDetalles.size() - 1;
            HSSFRow row = sheet.createRow(rowCot);

            HSSFCell cell = row.createCell(0);
            cell.setCellStyle(contStyle);
            cell.setCellValue(j);

            cell = row.createCell(1);
            cell.setCellStyle(contStyle);
            cell.setCellValue(UtilitarioFecha.formatearFecha(detalle.getIdOrdenCompraServicio().getFechaEmision(), "dd/MM/yyyy"));
            
            cell = row.createCell(2);
            cell.setCellStyle(contStyle);
            if(detalle.getIdOrdenCompraServicio().getIdOrdenPedido()!= null){
                cell.setCellValue(detalle.getIdOrdenCompraServicio().getIdOrdenPedido().getCodigoOrdenPedido());
            }else{
                cell.setCellValue(" ");
            }
            
            
            cell = row.createCell(3);
            cell.setCellStyle(contStyle);
            cell.setCellValue(detalle.getIdArticulo().getNombreComercial());
            

            cell = row.createCell(4);
            cell.setCellStyle(contStyle);
            cell.setCellValue(detalle.getIdOrdenCompraServicio().getIdProveedor().getRazonSocial());

            cell = row.createCell(5);
            cell.setCellStyle(contNStyle);
            cell.setCellValue(detalle.getPrecio().floatValue());

            /*cell = row.createCell(4);
             cell.setCellStyle(contNStyle);
             cell.setCellValue(detalle.getIdOrdenCompraServicio().getCodigo());*/

            j++;
            rowCot++;
        }
        rowCot++;



        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.setResponseContentType("application/vnd.ms-excel");
        externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"PrecioArticulos.xls\"");

        wb.write(externalContext.getResponseOutputStream());
        facesContext.responseComplete();

    }

    public void reportePrecioServicio() throws IOException, ServiceException {

        List<DetalleOrdenCompraServicio> listaDetalles = servicioDetalleOCS.listarDetallesParaReporteOS(bkReporte.getDetalleOrdenCompra(), bkReporte.getOrdenarArt(), bkReporte.getFechaInicioArt(), bkReporte.getFechaFinalArt());
        //Workbook workbook = new XSSFWorkbook(OPCPackage.open(new FileInputStream("d:/ChartSample.xlsx"))); // or sample.xls
        HSSFWorkbook wb = new HSSFWorkbook();
        //HSSFSheet sheet = wb.createSheet("Cotizaciones");
        HSSFSheet sheet = wb.createSheet("Proveedores Servicio");

        sheet.setAutobreaks(true);
        //sheet.setDefaultColumnWidth(10);
        sheet.setAlternativeFormula(true);
        sheet.setColumnWidth(0, 1000);
        sheet.setColumnWidth(1, 4500);
        sheet.setColumnWidth(2, 4500);
        sheet.setColumnWidth(3, 7000);
        sheet.setColumnWidth(4, 12000);
        sheet.setColumnWidth(5, 12000);
        sheet.setColumnWidth(6, 4500);
        //sheet.setVerticallyCenter(true);
        sheet.setRowSumsBelow(true);

        HSSFCellStyle borderStyle = wb.createCellStyle();
        borderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        borderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        HSSFCellStyle borderDotStyle = wb.createCellStyle();
        borderDotStyle.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderRight(HSSFCellStyle.BORDER_DOTTED);
        borderDotStyle.setBorderTop(HSSFCellStyle.BORDER_DOTTED);

        HSSFPalette palette = wb.getCustomPalette();
        palette.setColorAtIndex(HSSFColor.VIOLET.index, (byte) 79, (byte) 129, (byte) 189);

        /**
         * ***** fuente para titulo ******************
         */
        HSSFFont titFont = wb.createFont();
        titFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        titFont.setFontHeightInPoints(Short.valueOf("10"));

        HSSFCellStyle titStyle = wb.createCellStyle();
        titStyle.setFont(titFont);
        titStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        /**
         * ***** fuente para cabecera ******************
         */
        HSSFFont cabFont = wb.createFont();
        cabFont.setColor(HSSFColor.WHITE.index);
        cabFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cabFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle cabStyle = wb.createCellStyle();
        cabStyle.cloneStyleFrom(borderStyle);
        cabStyle.setFillForegroundColor(HSSFColor.VIOLET.index);
        cabStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        cabStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        cabStyle.setFont(cabFont);

        /**
         * ***** fuente para detalle ******************
         */
        HSSFFont contFont = wb.createFont();
        contFont.setFontHeightInPoints(Short.valueOf("7"));

        HSSFCellStyle contStyle = wb.createCellStyle();
        contStyle.cloneStyleFrom(borderDotStyle);
        contStyle.setFont(contFont);
        contStyle.setWrapText(true);

        /**
         * ***** fuente para detalle Numerico ******************
         */
        HSSFCellStyle contNStyle = wb.createCellStyle();
        contNStyle.cloneStyleFrom(borderDotStyle);
        contNStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
        contNStyle.setFont(contFont);

        HSSFRow rowCab = sheet.createRow(1);

        HSSFCell cellCab0 = rowCab.createCell(0);
        cellCab0.setCellStyle(titStyle);
        cellCab0.setCellValue("PRECIO DE SERVICIOS POR PROVEEDOR " + armarFecha(bkReporte.getFechaInicioOC(), bkReporte.getFechaFinalOC()));
        CellRangeAddress region = new CellRangeAddress(1, 1, 0, 5);
        sheet.addMergedRegion(region);


        HSSFRow rowC = sheet.createRow(4);

        HSSFCell cellCli = rowC.createCell(0);
        cellCli.setCellStyle(cabStyle);
        cellCli.setCellValue("Nº");

        cellCli = rowC.createCell(1);
        cellCli.setCellStyle(cabStyle);
        cellCli.setCellValue("FECHA");
        
        cellCli = rowC.createCell(2);
        cellCli.setCellStyle(cabStyle);
        cellCli.setCellValue("OP");

        cellCli = rowC.createCell(3);
        cellCli.setCellStyle(cabStyle);
        cellCli.setCellValue("SERVICIO");

        cellCli = rowC.createCell(4);
        cellCli.setCellStyle(cabStyle);
        cellCli.setCellValue("ARTICULO");

        cellCli = rowC.createCell(5);
        cellCli.setCellStyle(cabStyle);
        cellCli.setCellValue("PROVEEDOR");

        cellCli = rowC.createCell(6);
        cellCli.setCellStyle(cabStyle);
        cellCli.setCellValue("PRECIO");

        int rowCot = 5;
        int j = 1;
        for (DetalleOrdenCompraServicio detalle : listaDetalles) {
            int i = listaDetalles.size() - 1;
            HSSFRow row = sheet.createRow(rowCot);

            HSSFCell cell = row.createCell(0);
            cell.setCellStyle(contStyle);
            cell.setCellValue(j);

            cell = row.createCell(1);
            cell.setCellStyle(contStyle);
            cell.setCellValue(UtilitarioFecha.formatearFecha(detalle.getIdOrdenCompraServicio().getFechaEmision(), "dd/MM/yyyy"));
            
            cell = row.createCell(2);
            cell.setCellStyle(contStyle);
            if(detalle.getIdOrdenCompraServicio().getIdOrdenPedido()!= null){
                cell.setCellValue(detalle.getIdOrdenCompraServicio().getIdOrdenPedido().getCodigoOrdenPedido());
            }else{
                cell.setCellValue(" ");
            }
            
            cell = row.createCell(3);
            cell.setCellStyle(contStyle);
            cell.setCellValue(detalle.getIdOrdenCompraServicio().getServicio());

            cell = row.createCell(4);
            cell.setCellStyle(contStyle);
            cell.setCellValue(detalle.getIdArticulo().getNombreComercial());

            cell = row.createCell(5);
            cell.setCellStyle(contStyle);
            cell.setCellValue(detalle.getIdOrdenCompraServicio().getIdProveedor().getRazonSocial());

            cell = row.createCell(6);
            cell.setCellStyle(contNStyle);
            cell.setCellValue(detalle.getPrecio().floatValue());

            /*cell = row.createCell(4);
             cell.setCellStyle(contNStyle);
             cell.setCellValue(detalle.getIdOrdenCompraServicio().getCodigo());*/

            j++;
            rowCot++;
        }
        rowCot++;



        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.setResponseContentType("application/vnd.ms-excel");
        externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"PrecioServicios.xls\"");

        wb.write(externalContext.getResponseOutputStream());
        facesContext.responseComplete();

    }
}
